package com.rg.lrgboot.controller;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.ScheduledFuture;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


import com.rg.lrgboot.controller.socket.WebSocketServer;
import com.rg.lrgboot.model.Bafile;
import com.rg.lrgboot.model.FdFile;
import com.rg.lrgboot.model.User;
import com.rg.lrgboot.service.FdFileService;
import com.rg.lrgboot.service.UserService;

@RestController
public class IndexController {
	
	@Autowired
	public UserService userService;
	@Autowired
	public FdFileService fdFileService;
	@Autowired
	private ThreadPoolTaskScheduler threadPoolTaskScheduler;
	
	private HashSet<IndexController> list = new  HashSet<IndexController>();
	
	private HashSet<HttpSession> list2 = new  HashSet<HttpSession>();
	
	private ScheduledFuture<?> future1;
	
	@RequestMapping("/")
    public String index() {
        return "hello, there";
    }
	
	@RequestMapping("/getMap")
    public HashMap<String, Object> getMap() {
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("key", "value");
        return map;
    }
	
	@RequestMapping("/getUserList")
    public HashMap<String, Object> getUserList() {
		HashMap<String, Object> map = new HashMap<String, Object>();
		List<User> userlist = userService.getUserList();
		map.put("key", "value");
		map.put("user", userlist);
        return map;
    }
	
	@PostMapping("/finishfile")
	public String finishTaskFile (FdFile fdFile) {
		try {
			System.out.println("接受前台参数"+fdFile.getName());
			//文件存在的位置
			String path = "/D:/project/demo/file";
			//获取文件名
			String fileName = fdFile.getFile().getOriginalFilename();
			System.out.println("接受前台参数"+fileName);
			//创建一个UUID用时间戳表示
			String UUID = new Date().getTime() + "";
			//组合成新文件名避免有重复的文件名
			String newFileName = UUID + fileName;
			//File.separator 表示:/
			File destFile = new File(path+File.separator+newFileName);
			//判断该文件下的上级文件夹是否存在 不存在创建
			if(!destFile.getParentFile().exists()) {
				destFile.getParentFile().mkdirs();
			}
			//上传文件
			fdFile.getFile().transferTo(destFile);//这一步结束就上传成功了。
			//==========================================================================分割线下面是我自己的业务需求，将其他信息和文件的名称，路径保存到数据库。
			//保存文件到数据库 这个是我自己业务需要的，如果只是单纯的上传文件到一个位置 则下面的代码就可以不同写了
			fdFile.setName(newFileName);
			fdFile.setSrc(path);
			fdFile.setFilepath(path+File.separator+fileName);
			fdFileService.insert(fdFile);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return "成功";
	}
	
	@PostMapping("/uploadmuti")
	public String uploadmuti (FdFile fdFile) {
		try {
			System.out.println("接受前台参数"+fdFile.getName());
			//文件存在的位置
			String path = "/D:/project/demo/file";
			for(MultipartFile mfile : fdFile.getFiles()) {
				//获取文件名
				String fileName = mfile.getOriginalFilename();
				System.out.println("接受前台参数"+fileName);
				//创建一个UUID用时间戳表示
				String UUID = new Date().getTime() + "";
				//组合成新文件名避免有重复的文件名
				String newFileName = UUID + fileName;
				//File.separator 表示:/
				File destFile = new File(path+File.separator+newFileName);
				//判断该文件下的上级文件夹是否存在 不存在创建
				if(!destFile.getParentFile().exists()) {
					destFile.getParentFile().mkdirs();
				}
				//上传文件
				mfile.transferTo(destFile);//这一步结束就上传成功了。
				fdFile.setSrc(path);
				fdFile.setFilepath(path+File.separator+fileName);
				fdFileService.insert(fdFile);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return "成功";
	}
	
	@PostMapping("/babafile")	
	public String babafile (Bafile bafile) {
		try {
			System.out.println("接受前台参数"+bafile.getDetail());
			//文件存在的位置
			String path = "/D:/project/demo/file";
			for(FdFile fdFile:bafile.getFdFiles()) {
				System.out.println("接受前台name参数"+fdFile.getName());
				//获取文件名
				String fileName = fdFile.getFile().getOriginalFilename();
				System.out.println("接受前台文件参数"+fileName);
				//创建一个UUID用时间戳表示
				String UUID = new Date().getTime() + "";
				//组合成新文件名避免有重复的文件名
				String newFileName = UUID + fileName;
				//File.separator 表示:/
				File destFile = new File(path+File.separator+newFileName);
				//判断该文件下的上级文件夹是否存在 不存在创建
				if(!destFile.getParentFile().exists()) {
					destFile.getParentFile().mkdirs();
				}
				//上传文件
				fdFile.getFile().transferTo(destFile);//这一步结束就上传成功了。
				fdFile.setDetail(bafile.getDetail());
				fdFile.setSrc(path);
				fdFile.setFilepath(path+File.separator+fileName);
				fdFileService.insert(fdFile);
			}				
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		return "成功";
	}
	
	@RequestMapping("/getFdFile")
	public List<FdFile> getFdFile() {
		return fdFileService.getList();
	}
	
	@RequestMapping("/startCron")
	public String startCron1() {

		future1 = threadPoolTaskScheduler.schedule(() -> System.out.println("需要手动启动的定时任务，每十秒执行一次" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())), 
				triggerContext ->  new CronTrigger("0/10 * * * * *").nextExecutionTime(triggerContext));

		System.out.println("定时任务正在执行-----");
		return "定时任务启动成功！";
	}

	@RequestMapping("/stopCron")
	public String stopCron1() {
		if (future1 != null) {
			future1.cancel(true);
		}
		System.out.println("定时任务关闭");
		return "定时任务关闭成功！";
	}

	@RequestMapping("/push/{toUserId}")
    public String pushToWeb(String message, @PathVariable String toUserId){
        try {
			WebSocketServer.sendInfo(message,toUserId);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return "MSG SEND SUCCESS";
    }
	
	@RequestMapping("/addController/{name}")
	public HashMap<String,Object> addController(HttpSession session, @PathVariable String name) {
		list.add(this);
		list2.add(session);
		session.setAttribute("username", name);
		HashMap<String,Object> map = new HashMap<String,Object>();
		map.put("c_count", list.size());
		map.put("s_count", list2.size());
		return map;
	}
	
	@RequestMapping("/getSessionName")
	public HashMap<String,Object> getSessionName(HttpSession session) {
		list.add(this);
		list2.add(session);
		session.getAttribute("username");
		HashMap<String,Object> map = new HashMap<String,Object>();
		map.put("c_count", list.size());
		map.put("s_count", list2.size());
		map.put("username", session.getAttribute("username"));
		return map;
	}
}
